home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGNG_C / CSTUFF.LZH / FWRITE.ASM < prev    next >
Assembly Source File  |  1986-09-14  |  5KB  |  107 lines

  1. ;fwrite.asm  -  a modification of FastWrite.PAS
  2. ;                 to run under Microsoft C using the MASM Assembler
  3. ;                 Writes directly to the screen buffer
  4. ;
  5. ;   This routine is based on the FastWrite routine submitted
  6. ;   to the Borland SIG on CompuServe. It has been tested for
  7. ;   use with programs written under the Microsoft C Compiler,
  8. ;   version 3.0, under the small memory model only. Its use
  9. ;   with the medium and large memory models is not guaranteed,
  10. ;   due to the fact that these models sometimes change the
  11. ;   value of DS, which this routine uses to locate the string.
  12. ;   In calling the routine from a C program, the value for
  13. ;   the string 'st' can be supplied by passing a pointer to
  14. ;   a string or, as is convenient with C, a string literal
  15. ;   itself (the program will take the address of the 0th element
  16. ;   of the string).
  17. ;
  18. ;   Acknowledgements:
  19. ;   Brian Foley submitted the Turbo Pascal inline code version
  20. ;   of this routine to the Borland SIG on CompuServe. David B.
  21. ;   Rein helped to convert the code, and some final modifications
  22. ;   were done by Michael D. Most.
  23. ;
  24. ;   Questions may be answered by contacting Brian Foley on
  25. ;   CompuServe [76317,3247], or Mike Most [70446,1244].
  26. ;
  27. ;
  28. ;**********************************************************
  29. ;*                                                        *
  30. ;*            usage:  fwrite(st,row,col,attr)             *
  31. ;*                     char *st;                          *
  32. ;*                     int row, col, attr;                *
  33. ;*                                                        *
  34. ;**********************************************************
  35. ;
  36.  IGROUP       group  _TEXT
  37.               assume CS:IGROUP
  38. ;
  39.  _TEXT        segment byte public 'CODE'        
  40.               public   _fwrite
  41. _fwrite       proc     near      
  42.               push     bp             ;MSC entry
  43.               mov      bp,sp
  44.               push     di
  45.               mov      bx,si          ;save SI in BX
  46.               mov      ax,40h         ;get video mode
  47.               mov      es,ax
  48.               mov      dl,es:[49h]    ;DL=Video mode, stored by BIOS
  49.               mov      di,[bp+6]      ;DI=Row
  50.               dec      di             ;make row 0-24 instead of 1-25
  51.               mov      cl,4           ;CL=4, CH=0
  52.               shl      di,cl          ;DI=Row*32
  53.               mov      ax,di          ;store in AX
  54.               shl      di,1           ;DI=Row*32
  55.               shl      di,1           ;DI=Row*64
  56.               add      di,ax          ;di=row*80
  57.               add      di,[bp+8]      ;Add (Col +1) to di
  58.               dec      di             ;DI=(Row*80) + Column
  59.               shl      di,1           ;account for attribute byte
  60.               mov      si,Word Ptr[bp+4] ;DS:SI points to String
  61.               mov      ah,[bp+10]     ;AH = attribute
  62.               cmp      dl,7           ;Mono??
  63.               je       _mono
  64.               mov      dx,0b800h      ;base of video buffer
  65.               mov      es,dx          ;ES = segment for color memory
  66.               mov      dx,03dah       ;6845 port address
  67.   _getnext:   lodsb                   ;load next char into al
  68.               or       al,al          ;test for null character
  69.               jz       _exit          ;exit if it's a null
  70.               mov      cx,ax          ;store video word in CX
  71.               cli                     ;no interrupts
  72.   _waitnoh:   in       al,dx          ;get 6845 status
  73.               test     al,8           ;Vertical retrace?
  74.               jnz      _store         ;if so, go
  75.               rcr      al,1           ;else, wait for end of
  76.               jc       _waitnoh       ;horizontal retrace
  77.   _waith:     in       al,dx          ;get 6845 status again
  78.               rcr      al,1           ;wait for horizontal
  79.               jnc       _waith        ;retrace
  80.   _store:     mov       ax,cx         ;move word back to AX..
  81.               stosw                   ;and then to screen
  82.               sti                     ;allow interrupts
  83.               jmp      short _getnext ;get next character
  84.   _mono:      mov      dx,0b000h
  85.               mov      es,dx          ;ES = segment for mono memory
  86.   _next:      lodsb                   ;Load next char into AL
  87.               or       al,al          ;Test for null char
  88.               jz       _exit          ;Exit if it's a null
  89.               stosw                   ;Move video word into place
  90.               jmp      short _next    ;get next character
  91.   _exit:      mov      si,bx          ;restore SI from BX
  92.               pop      di             ;MSC cleanup_ TEXT
  93.               mov      sp,bp
  94.               pop      bp
  95.               ret
  96.   _fwrite     endp    
  97.   _TEXT       ends
  98.               end
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.